MediaTailor Ad insertionで広告付きVOD動画配信をやってみた [2024初夏編]
はじめに
清水です。本ブログエントリではAWSのリニアチャネルアセンブリとパーソナライズされた広告挿入サービスであるAWS Elemental MediaTailorのAd insertion(広告挿入)機能を使い、VOD動画にプリロール広告をつけて配信をしてみます。
2024初夏編にあたり
この「MediaTailorを使ったプリロール広告付きVOD動画配信」ですが、実はおよそ5年前の2019年7月に以下ブログエントリで同様の内容を執筆しています。ではなぜ再び同じテーマでブログエントリを執筆するのでしょうか。ここでは過去ブログエントリとの差分などをまとめておきます。
個人的に、ここ最近MediaTailorではChannel assembly機能を扱うことが多く、Ad insertion機能についてはあまり触れてきませんでした。(MediaTailorのブログエントリのほとんどがChannel assemblyのアップデートとなっていますね。)そんな中、先日ひさしぶりにAd insertion機能を触ってみたのですが、上記ブログエントリで使用しているAWSのワークショップ(過去ブログエントリ内ではチュートリアルと表記)aws-media-services-simple-vod-workflowがアーカイブされていることに気が付きました。
さらに、以下の「MediaTailorを使ったプリロール広告付きライブ動画配信」ブログエントリ執筆時に参照したAWSのワークショップaws-media-services-simple-live-workflowについてもアーカイブになっています。
どちらのワークショップもドキュメントとしての参照はできるのですが、ワークショップ内で利用している環境が参照できなくなってしまっています。個人的にこれは痛いな、と思ったのがCloudFrontドメインでホスティングされていた広告決定サーバや広告動画などの参照ができなくなってしまっていたことです。過去のブログエントリではこのワークショップ内で参照していたCloudFrontドメインの(ワークショップ用の)広告決定サーバや広告動画を使用していたため、2024年初夏の現在は同様の設定を行ってもMediaTailorを使った広告付き動画配信ができなくなってしまっています。
ただ、新規に公開されているAWSワークショップを参照するとMediaTailorを試してみるということは可能です。2024年初夏の段階では、以下のOne Media WorkshopがAWS Media Servicesを網羅したワークショップとなっているかと思います。MediaTailorについてもAdvanced Topics (300+)で詳細に触れられていますね。
上記ワークショップの手順をなぞることでMediaTailorでを使った広告付き動画配信を行うことはできるのですが、再度ワークショップが更新されるとということも起こり得ます。ということで、今回は可能な限り自前のAWS環境内で完結する状態でMediaTailorの動作検証をしてみようというのが目的となります。
また以前のブログエントリよりもわかりやすくまとめたい、ということも執筆の目的です。当時はやっとMediaTailorが動いた!という興奮とともにブログエントリを執筆した記憶がありますが、あとから手順を確認する、再現するという点では改善の余地が大いにあるなと読み返したときに実感しました。今回のブログエントリでは少しでも再現が容易になるようにまとめられればと思っております。
本ブログエントリの「MediaTailorを使ったプリロール広告付きVOD動画配信」
ということで本ブログエントリでは、自前のAWS環境内で完結する状態での「MediaTailorを使ったプリロール広告付きVOD動画配信」ができるようにしていきます。自AWS環境内でということで、広告挿入部分はMediaTailorの基本的な動作確認のみを目的とした、静的VAST(static VAST)を利用してプリロール(preroll、動画本編の前に挿入される広告)のみを扱います。またMediaTailorとCloudFront連携についても確認します。
内容としては以下となります。左側の目次もあわせて活用ください。
- 準備
- VOD動画コンテンツの準備(MediaConvertでの変換を含む)
- 広告決定サーバや広告動画の準備(静的VASTの準備を含む)
- MediaTailor単体でVOD動画にプリロール広告挿入
- MediaTailorをCloudFrontと連携させて広告付き動画配信
なお、本ブログエントリの執筆、MediaTailorやCloudFrontの設定については以下のAWSワークショップを参考にしています。(Public archive状態のものも含まれます。)
- GitHub - aws-samples/aws-media-services-simple-vod-workflow: Lab that covers video conversion workflow for Video On Demand using AWS MediaConvert.
- GitHub - aws-samples/aws-media-services-simple-live-workflow: Workshop that covers AWS Elemental MediaLive, MediaPackage, and MediaTailor services
- One Media Workshop
準備
まずは準備として、VOD動画コンテンツや広告決定サーバなどを作成していきます。MediaTailorを使ったプリロール広告付きVOD動画配信では、広告を挿入するもととなるVOD動画コンテンツ(ストリーム)と広告決定サーバが必要です。また広告決定サーバ内では広告となる動画も指定します。今回、広告決定サーバからは静的VASTレスポンスを返すこととします。この静的VASTレスポンス、ならびにこのVAST内で参照している広告動画についても準備します。
最終的には以下のように、VOD動画コンテンツをホスティングする環境(ドメイン)には動画コンテンツが格納され、広告決定サーバとなる環境(ドメイン)では静的VAST用XMLファイルと広告動画がホスティングされる状況となります。
https://content-source.example.com/ └── vod/ ├── content01.m3u8 # VOD動画コンテンツその1 ├── (そのほかcontent01のm3u8、tsファイル) ├── content02.m3u8 # VOD動画コンテンツその2 └── (そのほかcontent02のm3u8、tsファイル)
https:///ad-decision.example.com/ └── ads/ ├── ad-kichijoji-station-s1-15.mp4 # 挿入する広告動画 └── static-vast-demo.xml # 静的VASTレスポンス
今回は検証用ということで、Amazon S3をホスティング環境に使用して配信することとしました。動画コンテンツ用、広告決定サーバ用と2つのS3バケットを作成し、必要なファイルをオブジェクトとしてS3バケット内に配置していきます。
S3バケットの準備
バケットの作成
まずは各種コンテンツ配信用のS3環境の準備です。VOD動画コンテンツ用、広告決定サーバ用と2つのS3バケットを作成します。今回は以下の命名規則としました。(xxxxxxxx
部分はランダムな英数小文字を設定しています。)
- VOD動画コンテンツ用S3バケット
content-source-xxxxxxxx
- 広告決定サーバ用S3バケット
ad-decision-xxxxxxxx
S3バケットの作成はマネジメントコンソールから行いました。[Create bucket]ボタンで進み、バケット名以外はデフォルトの設定のままS3バケットを作成しています。なお、リージョンは東京リージョン(ap-northeast-1)を使用しています。(以降、MediaTailorリソースについても同様です。)S3のURLが[Bucket name].s3.ap-northeast-1.amazonaws.com
となる点に留意しておきましょう。
バケットの公開権限の設定
S3バケットが作成できたら、続いて作成したS3バケットでコンテンツ配信を行うための公開設定を行います。s3:GetObject
権限を開放しPublicRead、読み取りでアクセスを許可するS3とするかたちですね。
(なおコンテンツ配信をする環境と考えればS3単体ではなく、CloudFront+S3の構成で使用するのがベストプラクティスかと思います。今回は検証目的とういことでS3単体で使用しています。またMediaTailorからみてコンテンツオリジンとなる動画コンテンツ配信環境については、CloudFrontを前段に挟むべきかどうか、構成的に悩ましい点もあります。こちらは別の機会に考えてみたいと思います。)
まずは作成したS3バケットのBlock public access設定を変更します。バケットの詳細画面のPermissionsタブ、デフォルト設定でS3バケットを作成したので、"Block all public access"の状態ですね。この"Block all public access"のチェックをすべて外して無効とします。(ACLについてのBlock public access設定2種は有効のままでも目的は果たせそうですが、今回はシンプルにすべてのBlock設定を無効としました。)
Block public access設定を変更したら、続いてBucket policyを編集します。デフォルトはPolicyに何も設定されていない状態です。このPolicyに、PublicRead権限として以下のPolicyを設定します。DOC-EXAMPLE-BUCKET
を実際のS3バケット名に置き換えます。
{ "Version": "2012-10-17", "Id": "PublicReadForGetBucketObjects", "Statement": [ { "Sid": "PublicReadForGetBucketObjects", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }
Bucket policy編集後、このS3バケットへアップロードしたファイル(オブジェクト)はすべて読み取り権限でアクセス可能になる点に留意しておきましょう。
動画コンテンツ用S3バケットにCORSを設定
動画コンテンツを格納し配信するS3バケットについては、Webブラウザ上の動画プレイヤーから動画コンテンツの再生ができるようにCORSを設定しておきます。
VOD動画コンテンツ用に作成したS3バケットcontent-source-xxxxxxxx
の詳細ページ、PermissionsタブのCross-origin resource sharing (CORS)の項目を確認、デフォルトは何も設定されていない状態です。以下のJSONの内容で設定します。
[ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [], "MaxAgeSeconds": 3000 } ]
CORSはVOD動画コンテンツ用S3バケットcontent-source-xxxxxxxx
にのみ設定が必要で、広告決定サーバ用S3バケットad-decision-xxxxxxxx
には設定不要である認識です。また上記のCORS設定では、すべてのドメイン(Webサイト)上の動画プレイヤーから動画の再生が可能になります。本番環境などで特定のドメインのみに限定する場合はAllowedOrigins
の値を適切に指定しましょう。
動画コンテンツの準備
続いてはVOD動画コンテンツの準備です。今回の検証ではVOD動画コンテンツはHLSストリームの形式とし、MediaConvertで変換して準備しました。Jobの作成については既存のJob template(System template)をベースにしますが、ABRのrenditionとName modifierを変更するためにCustom templateを作成してこれを使用します。
MediaConvertのCustom templateの作成
具体的には、Job templatesでSystem templatesのOTT-HLS、System-Ott_Hls_Ts_Avc_Aac
をまずは選択、これを[Duplicate]してCustom templateを作成します。
Nameを適切に設定し、Output groupsのApple HLS
の設定に進みます。
Outputsの箇所、8つのABR renditionがならびますが、このうち_Ott_Hls_Ts_Avc_Aac_16x9_640x360p_30Hz_1200Kbps
(上から3つ目)と_Ott_Hls_Ts_Avc_Aac_16x9_1280x720p_30Hz_5000Kbps
(上から6つ目、下から3つ目)以外を削除します。(スクリーンショット中、Name modifier欄が見切れてしまっていますが右にカーソルを進めて確認しましょう。)
また出力ファイル名をシンプルにするため、_Ott_Hls_Ts_Avc_Aac_16x9_640x360p_30Hz_1200Kbps
を_360p
、_Ott_Hls_Ts_Avc_Aac_16x9_1280x720p_30Hz_5000Kbps
を_720p
になるようName modifierを設定します。
2つのABR renditionのみが残っていることとName modifierの変更を確認して[Create]ボタンを押下、Custom templateを作成します。
MediaConvertのJobの作成
作成したCustom templateの詳細画面から[Create job]ボタンでHLSストリーム作成のJobを設定していきます。
Job作成の際、出力先(Apple HLS group settingsのDestination)は先ほどVOD動画コンテンツ用に作成したS3バケットcontent-source-xxxxxxxx
内のパス/vod/
としておきます。
s3://content-source-xxxxxxxx/vod/
Job settings内のAWS integrationにあるIAMロールの設定を忘れずに行い、[Create]ボタンでJobを作成します。
なお入力は別途準備したS3バケットにアップロード済みのcontent01.mov
、content02.mov
という2種の動画です。(合計2つのJobを作成、2種類のVOD動画コンテンツを準備しました。)
どちらもスマホで井の頭公園を撮影したもので、尺は1分と少し。Macのクイックルックで確認すると以下のようなコンテンツとなります。
変換後のHLSストリームの再生確認
MediaConvertで作成したJobがCompleteとなったら、出力先のS3を参照しHLSストリームの再生URLを確認しておきましょう。以下のようなURLとなりました。(URL最後のm3u8のファイル名、content01
をcontent02
に変更すれば2つ目のVOD動画コンテンツのHLSストリームとなります。)
https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/vod/content01.m3u8
この時点で通常のHLSストリームとして動画プレイヤーで再生が可能か確認しておきます。本エントリ内、動画プレイヤーとしてはhls.js demoを使用しました。ページを開き、設定項目左上のhttps://
で始まる箇所にMediaConvertで変換したHLSストリームの再生URLを入力して[Apply]します。
想定した動画コンテンツがストリーミング再生されること、エラーなどが表示されないことを確認しておきましょう。
広告用動画の準備
次は広告用の動画を準備します。この広告用の動画は各ワークショップなどを参考にMP4形式で準備することとしました。尺は15秒となるようにします。これもMediaConvertを使って変換しました。
もととなる動画はスマホで吉祥寺駅を撮影したものを準備、こちらもMacのクイックルックで確認すると以下のようなコンテンツとなります。(井の頭公園はVODコンテンツ本編、吉祥寺駅なら広告用動画、という区別をしています。)
MediaConvertのマネジメントコンソール、[Create job]からInputにS3にアップロードしたもと動画ファイルを指定、Input clipsで15秒の尺になるようEnd timecodeを設定します。
Output groupsはFile groupsを選択、PreestはSystem presetsのGeneric-HDカテゴリ内、System-Generic_Hd_Mp4_Avc_Aac_16x9_Sdr_1280x720p_30Hz_5Mbps_Qvbr_Vq9
を使用しました。
また出力先は広告決定サーバ用S3バケットとします。ここで、s3://ad-decision-xxxxxxxx/ads/ad-
とパス部分も含めてDestinationに指定します。またName modifierに$fn$-15
、 Extensionに.mp4
と指定することで、変換後の動画がs3://ad-decision-xxxxxxxx/ads/ad-[元のファイル名(拡張子なし)]-15.mp4
と出力されるようにしました。
Jobを作成してMediaConvertの変換が完了したら、広告用動画のURLを確認しておきましょう。変換後のMP4動画のS3オブジェクト詳細画面を開きObject URLを確認します。以下のようになりました。
https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4
S3バケット内で公開状態になっているかも確認しておきましょう。curlコマンドに-I
オプションを付けて実行、以下のようなレスポンスヘッダが確認できました。
% curl -I https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4 HTTP/1.1 200 OK x-amz-id-2: po7ixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+Q== x-amz-request-id: 48xxxxxxxxxxxx1G Date: Tue, 28 May 2024 06:59:18 GMT Last-Modified: Tue, 28 May 2024 06:56:24 GMT ETag: "31xxxxxxxxxxxxxxxxxxxxxxxxxxxx69" x-amz-server-side-encryption: AES256 x-amz-meta-mediaconvert-jobid: 17xxxxxxxxx96-6xxxxx Accept-Ranges: bytes Content-Type: video/mp4 Server: AmazonS3 Content-Length: 7831258
広告決定サーバとなるstatic VASTの準備
続いては広告決定サーバの準備です。広告決定サーバでは本来、アクセスしているユーザ情報などに応じて広告を出し分ける機能などを有するかと思いますが、本章のはじめに述べたとおり本エントリでは広告決定サーバからは静的VASTレスポンスを返し、この静的VASTを用いて固定のプリロール広告をVOD動画へ挿入するという動作の検証とします。
本節ではこの静的VASTを作成、S3バケットに配置します。リクエストに対してこの静的VAST用XMLファイルをレスポンスとして返すことで、広告決定サーバの代用とします。VASTの作成には以下のAWS for M&E Blogのエントリを参考にしました。
以下のファイルstatic-vast-demo.xml
を準備しました。上記AWS for M&E Blogのエントリ内のサンプルXMLから12行目のwidth
とheight
、そして13行目の広告動画のURLを変更しています。それぞれ、実際に使用する広告動画にあわせるかたちですね。
<VAST version="3.0"> <Ad> <InLine> <AdSystem>2.0</AdSystem> <AdTitle>ad-1</AdTitle> <Impression/> <Creatives> <Creative> <Linear> <Duration>00:00:15</Duration> <MediaFiles> <MediaFile delivery="progressive" type="video/mp4" width="1280" height="720"> <![CDATA[https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4]]> </MediaFile> </MediaFiles> </Linear> </Creative> </Creatives> </InLine> </Ad> </VAST>
広告決定サーバ用S3バケットのパス/ads
配下にアップロード、以下のURLでアクセスできることを確認しておきます。
https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/static-vast-demo.xml
以下、S3バケットにアップロード後にcurlコマンドで確認した例です。公開状態となっているかも確認しておきましょう。
% curl -i https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/static-vast-demo.xml HTTP/1.1 200 OK x-amz-id-2: szguxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2kg= x-amz-request-id: FPxxxxxxxxxxxxEK Date: Tue, 28 May 2024 07:21:00 GMT Last-Modified: Tue, 28 May 2024 07:20:22 GMT ETag: "80xxxxxxxxxxxxxxxxxxxxxxxxxxxx9d" x-amz-server-side-encryption: AES256 Accept-Ranges: bytes Content-Type: text/xml Server: AmazonS3 Content-Length: 616 <VAST version="3.0"> <Ad> <InLine> <AdSystem>2.0</AdSystem> <AdTitle>ad-1</AdTitle> <Impression/> <Creatives> <Creative> <Linear> <Duration>00:00:15</Duration> <MediaFiles> <MediaFile delivery="progressive" type="video/mp4" width="1280" height="720"> <![CDATA[https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4]]> </MediaFile> </MediaFiles> </Linear> </Creative> </Creatives> </InLine> </Ad> </VAST>
準備完了
以上で「MediaTailorを使ったプリロール広告付きVOD動画配信」のための準備が完了しました。広告を挿入するもととなるVOD動画コンテンツ、広告用の動画、広告決定サーバ、それぞれがAWS環境内(S3バケット内)でホスティングされている状態です。
以下、改めて準備した内容のURLをまとめておきましょう。なお、VOD動画コンテンツ用S3バケットとしてcontent-source-xxxxxxxx
、広告決定サーバ用S3バケットとしてad-decision-xxxxxxxx
をそれぞれ東京リージョンに作成している想定となります。
- VOD動画コンテンツ(ストリーム再生URL)
https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/vod/content01.m3u8
https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/vod/content02.m3u8
- 広告用動画
https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4
- 広告決定サーバ(static VAST)
https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/static-vast-demo.xml
MediaTailor単体でVOD動画にプリロール広告挿入
それではいよいよMediaTailorを使ったプリロール広告付きVOD動画配信を行っていきます。本番環境向けではMediaTailorとCloudFrontの連携は必須と考えますが、まずはMediaTailorのみでの広告付き動画配信を設定、実際に再生できるか動作を確認していきましょう。
MediaTailor Configurationリソースの作成
MediaTailorのConfigurationリソースを作成します。設定内容は以下です。その他の項目はデフォルト値(もしくは指定しない状態)で進めました。
- Name
- 任意のConfigurationリソース名。今回は
vod-preroll
としました
- 任意のConfigurationリソース名。今回は
- Content source
- 動画コンテンツ(VOD動画本編)のURLを指定します。パスの一部を指定することも可能です
- 今回は動画コンテンツをホスティングしている環境のドメイン部分までを指定しました
https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com
- Ad decision server
- 広告決定サーバのURLを指定します
- 今回は静的VASTレスポンスのURLを指定しました
https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/static-vast-demo.xml
MediaTailorのマネジメントコンソール、Ad insertionのConfigurationsの画面に進み[Create configuration]ボタンからリソースを作成します。
広告付き動画の再生URLの確認
Configurationが作成できたら、広告付き動画の再生URLを確認していきます。
まずベースとなるのは事前に準備したVOD動画コンテンツの再生URLです。以下の形式のものでした。
https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/vod/content01.m3u8
ここからパス部分/vod/content01.m3u8
を控えておきます。
続いて作成したConfigurationの詳細画面を確認しましょう。Content & origin detailsのPlayback endpoint prefixes、HLS playback prefixの項目に注目します。
以下の形式のURLになっていますね。
https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/
この末尾に、先ほど確認した広告挿入もととなるVOD動画コンテンツ再生URLのパスの部分、/vod/content01.m3u8
を加えます。すると以下のようなURLが生成できますね。
https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/vod/content01.m3u8
2つめのVOD動画コンテンツであれば、パス部分が/vod/content02.m3u8
なので以下のようになります。
https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/vod/content02.m3u8
これがMediaTailorで広告が挿入された状態の動画再生URLとなります。
動画プレイヤーでの視聴確認
広告付き動画の再生URLが確認できたところで、実際にこのURLを動画プレイヤーに指定して視聴確認をしてみます。hls.js demoのページで以下の広告付き動画再生URL(再掲)を指定します。
https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/vod/content01.m3u8
冒頭、15秒間は吉祥寺駅の映像、つまり広告動画が再生されました。
15秒経過して広告動画が終わると井の頭公園の映像、VOD動画コンテンツ本編が再生されました。
プリロール広告付きのVOD動画配信ができましたね!2つ目のVOD動画コンテンツについてもURL末尾のm3u8ファイルの名称を変更すれば再生可能です。なお再生の際、広告部分だろうがVOD動画本編だろうが自由な位置にシークが可能です。また動画プレイヤー側に表示される動画の尺は広告動画とVOD動画本編をあわせたものになっています。これらは動画プレイヤーの仕様で、例えば広告動画はシークできないようにしたり、広告動画とVOD動画本編で動画の尺を別に表示する、といったことは動画プレイヤー側で処理を実装しないと実現できないもの、と考えています。
また広告付き動画の初回再生のタイミングなどでは、広告動画が表示されない場合があります。これは広告動画が動画コンテンツに一致する形式でまだトランスコードされていないことが原因です。数分などしばらくして再度再生を行えば広告動画が表示されるかと思います。この初回トランスコードについては、MediaTailorのUser Guideや、またVAST用XMLのレスポンス作成時に参考にしたAWS for M&E Blogのエントリにも記載があります。
MediaTailorをCloudFrontと連携させて広告付き動画配信
MediaTailor単体でのプリロール広告付きVOD動画配信ができました。続いてはこのMediaTailorとCloudFrontを連携させ、CloudFront経由のVOD動画配信環境としていきたいと思います。
なお、MediaTailorとCloudFrontの連携については以下のAWSワークショップを基本的な設定例として参考にしています。
最新のAWSワークショップOne Media WorkshopのMediaTailor advanced featuresのページでは、これとは別のパターンでCloudFront連携を行っています。User GuideのWorking with CDNsとあわせて設定内容について比較してみるとよいかと思います。
MediaTailorとCloudFrontを連携させる場合、まずはMediaTailorのConfigurationをCloudFront設定(CDN連携設定)なしで作成します。本エントリではこのConfigurationは先ほど作成したもの(vod-preroll
)を使用します。続いて、このMediaTailorのConfiguration(正確にいえばそのPlayback endpoint)をオリジンとしてCloudFront Distributionを作成します。CloudFront Distributionではそのほか、VOD動画コンテンツ配信元をオリジンとするなどの設定を行います。CloudFront Distributionの準備ができたら、このCloudFront DistributionのDomain nameをMediaTailor ConfigurationにCDN設定として登録します。MediaTailorとCloudFrontの設定を行ったり来たりする感じで少々複雑になりますので注意して設定を進めましょう。
CloudFront Distributionの作成と設定
まずはCloudFront Distributionを作成し各種設定を行っていきます。
Distributionの作成に入る前に、CloudFrontの連携先となるMediaTailor ConfigurationのPlayback endpointのドメイン名が必要になるので事前に確認しておきましょう。広告付き動画の再生URLを参照します。今回は以下が再生URLですので、67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com
がMediaTailor Configurationのドメイン名となります。
https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/vod/content01.m3u8
またCloudFront Distributionの設定についてあらかじめまとめておきます。CloudFrontのOriginとしては以下3種類が登録されている状況となります。
Origin name (任意の名称) | Origin domain | 備考 |
---|---|---|
mediatailor-ad-origin | segments.mediatailor.ap-northeast-1.amazonaws.com | リージョンごとに固定 (参考: Integrating a CDN) |
content-source-origin | content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com | VOD動画コンテンツ配信元のドメイン名 |
mediatailor-origin | 67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com | MediaTailor ConfigurationのPlayback endpointのドメイン名 |
Behaviorについては以下のようなPrecedence、Path patternとOriginが設定されている状態が最終形です。
Precedence | Path pattern | Origin |
---|---|---|
0 | /v1/* | mediatailor-origin |
1 | /vod/* | content-source-origin |
2 | Default (*) | mediatailor-ad-origin |
それぞれのBehaviorごとのPolicy設定は以下としました。
Path pattern | Cache policy | Origin request policy | Response header policy |
---|---|---|---|
/v1/* | CachingDisabled | AllViewerAndCloudFrontHeaders-2022-06 | SimpleCORS |
/vod/* | CachingOptimized | - | CORS-With-Preflight |
Default (*) | CachingOptimized | - | CORS-With-Preflight |
(なお、Path patternのわけ方はaws-media-services-simple-vod-workflow/11-VODMediaTailorを、CacheなどPolicy設定についてはOne Media WorkshopのMedia segment prefixesの項目をそれぞれ参考にしています。
以下、実際の設定画面などをまとめていきます。
VOD動画コンテンツ配信元をOriginとしてCloudFront Distributionを作成
まずはマネジメントコンソールからCloudFront Distributionを作成していきます。この際、OriginはVOD動画コンテンツ配信元を指定します。今回でいえばVOD動画コンテンツ用S3バケットcontent-source-xxxxxxxx
になりますね。
CloudFrontのマネジメントコンソール、[Create distribution]ボタンから進みOrigin domainにはcontent-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com
を指定します。Nameの項目ではOriginの区別がしやすいようにcontent-source-origin
としておきました。Origin accessは使用せずPublicとして進めます。
Default cache behaviorの設定の設定については後ほど変更するのでデフォルトのままとします。またWeb Application Firewall (WAF)の設定について、今回は検証用とということでDo not enable security protectionsを選択しました。あとでわかりやすいようにDescriptionを適切に設定して(今回はCloudFront for MediaTailor VOD preroll
としました)[Create Distribution]します。
MediaTailor Origin 2種の追加
続いて作成した(作成直後のDeploying状態の)CloudFront DistributionにOriginを追加していきます。MediaTailor用の2種類を追加するかたちです。Originsの項目から[Create origin]ボタンを押下します。
1つ目のOriginはMediaTailor ConfigurationのPlayback endpointのドメイン名をOrigin domainに指定します。今回であれば67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com
ですね。ProtocolとしてHTTPS only
となっていることを確認しておきましょう。またNameではmediatailor-origin
と指定しておきます。その他の項目はデフォルト値のまま、[Create origin]します。
さらにもう1つのOriginも追加します。同様に[Create origin]ボタンで進みます。Origin domainではsegments.mediatailor.ap-northeast-1.amazonaws.com
を指定します。このドメイン名はリージョンごとに固有のものとなっています。(参考: Integrating a CDN)こちらもProtocolとしてHTTPS only
となっていることを確認しておき、Nameではmediatailor-ad-origin
と指定しました。その他の項目はデフォルト値で[Create origin]します。
2種のOriginを追加後、Originは以下のように3種類が登録されている状況となります。
Behavior「/vod/*」の追加
Originを追加したら、続いてはBehaviorを追加していきます。まずはPath pattern /vod/*
のBehaviorです。この/vod/*
のパスについては、VOD動画コンテンツを配信するかたちになるのでcontent-source-origin
に振り分けるかたちですね。
Behaviorsの項目の[Create behavior]ボタンから進みます。Path patternでは/vod/*
と入力、Origin and origin groupsではcontent-source-origin
を選択します。またViewer protocol policyではRedirect HTTP to HTTPS
を選択しました。Cache key and origin requestsではCache policy: CachingOptimized
、またResponse headers policy: CORS-With-Preflight
としてBehaviorを作成します。
Behavior「/v1/*」の追加
続いてもう1つBehaviorを追加します。今度はPath patternが/v1/*
のBehaviorです。この/v1/*
のパスについてはMediaTailor ConfigurationのPlayback endpoint、mediatailor-origin
の名称で登録したOriginiにリクエストが振り分けられるようにします。
先ほどと同様に[Create behavior]ボタンから進み、Path patternでは/v1/*
と入力します。Origin and origin groupsではmediatailor-origin
を、Viewer protocol policyでRedirect HTTP to HTTPS
を選択します。Allowed HTTP methodsではGET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE
を選択しましょう。Cache key and origin requestsではCache policy: CachingDisabled
、Origin request policy: AllViewerAndCloudFrontHeaders-2022-06
、Response headers policy: SimpleCORS
としてBehaviorを作成します。
Behavior「Default (*)」の編集
デフォルトのBehaviorDefault (*)
を編集します。Distribution作成時にOriginをcontent-source-origin
として指定していましたが、これをmediatailor-ad-origin
に変更して細かな設定を行います。
Behaviors一覧画面でPath pattern Default (*)
を選択して[Edit]ボタンで進みます。Origin and origin groupsではmediatailor-ad-origin
を選択します。Viewer protocol policyはRedirect HTTP to HTTPS
を選びます。Cache key and origin requestsではCache policy: CachingOptimized
、またResponse headers policy: CORS-With-Preflight
を選択して、[Save changes]します。
Behaviorの優先順位の確認と調整
CloudFront DistributionへのOriginならびにBehaviorの追加、設定変更が完了しました。CloudFront Distributionの設定の最後にBehaviorの優先順位(Precedence)の確認と調整をしておきましょう。Default (*)
以外の動作、/vod/*
と/v1/*
についてはそれぞれで独立しているため、どちらが先になっても動作に支障はなさそうですが、参考にしたAWSワークショップにならい、優先順位 0(Precedence 0)を/v1/*
のmediatailor-origin
、優先順位 1(Precedence 1)を/vod/*
のcontent-source-origin
としておきます。Default (*)
のmediatailor-ad-origin
が優先順位 2(Precedence 2)となっていることも確認しておきましょう。優先順位の変更に必要がある場合は変更対象のBehaviorを選択して[Move up]または[Move down]し、順位を変更します。最後に忘れずに[Save]しましょう。
以下が最終的なBehaviorsのPrecedenceのならびです。
MediaTailor ConfigurationでCDN連携を設定
MediaTailor Configurationの連携先となるCloudFront Distributionの作成と設定ができました。続いてはMediaTailor Configuration側に、このCloudFront DistributionのDomain nameを設定します。
Configurationの設定前に、あらかじめCloudFrontのDomain nameを確認しておきます。Distribution詳細画面のGeneralのタブ、DetailsのDistribution domain nameが今回であれば。該当しますね https://d2p0xxxxxxxxxx.cloudfront.net
となります、Copyボタンでクリップボードにコピーして控えておきましょう。
MediaTailorのConfigurationの詳細ページに進みます。Content & origin detailsタブのCDN settingsの項目、どちらも値が設定されていない状態ですが、この箇所を変更していきます。[Edit]ボタンで進みましょう。
Edit configuration画面でAdvanced settingsの項目を展開します。表示されるCDN content segment prefix、CDN ad segment prefixのそれぞれに、先ほど確認したCloudFront DistributionのDomain nameをhttps://
から入力します。https://d2p0xxxxxxxxxx.cloudfront.net
というぐあいですね。
[Save configuration]します。遷移後のConfiguration詳細画面のCDN settingsの項目が正しく設定されていることを確認しておきましょう。
以上でMediaTailorのCloudFront連携の設定は完了です。
CloudFront連携時の広告付き動画再生URLの確認
MediaTailorとCloudFront(CDN)連携の設定ができたところで、このCloudFront連携時の広告付き動画再生URLについて確認しましょう。CloudFrontと連携しない状態、MediaTailor単体で広告付き動画再生URLは以下の形式でした。
https://67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxx/vod-preroll/vod/content01.m3u8
このURLのドメイン名部分、67xxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com
のところをCloudFront DistributionのDomain nameに変更します。今回であればd2p0xxxxxxxxxx.cloudfront.net
ですね。以下がMediaTailorとCloudFront連携時の広告付き動画再生URLです。
https://d2p0xxxxxxxxxx.cloudfront.net/v1/master/75xxxxxxxx/vod-preroll/vod/content01.m3u8
2つ目のVOD動画コンテンツの場合は末尾のパス部分が変わり、以下のようになります。
https://d2p0xxxxxxxxxx.cloudfront.net/v1/master/75xxxxxxxx/vod-preroll/vod/content02.m3u8
CloudFront連携した広告付き動画をプレイヤーで視聴
CloudFront連携した際の広告付き動画再生URLが確認できました。このURLをhls.js demoページで視聴してみます。CloudFront経由での配信ですが、MediaTailor単体での視聴の際と同様に視聴ができますね。
これだけだとCloudFront経由であるかわかりにくいため、Google Chromeのデベロッパーツールを使って詳細を確認してみます。それぞれのファイルがCloudFront経由での配信となっていることが確認できます。
まとめ
AWS Elemental MediaTailorのAd insertion(広告挿入)機能で、プリロール広告付きVOD動画配信をしてみました。AWSワークショップの手順にならいながら、VOD動画コンテンツにはじまり広告用の動画や広告決定サーバ代わりとなるstatic VASTのレスポンスについても準備し自AWS環境に配置しました。またAWSのCDNサービスであるAmazon CloudFrontとMediaTailorとの連携についても設定し、CloudFront経由のプリロール広告付きVOD動画配信についても確認してみました。
広告決定サーバのレスポンスが静的なVASTで、固定した広告動画がVODコンテンツ本編の前に流れるというシンプルな動作ですが、MediaTailor Ad insertionの動作の基本が押さえられたかと思います。個人的には冒頭で述べた通り、過去に試していたAWSワークショップがそのままでは動かなくなっていて、という点を自前のAWS環境で実現することでこれを回避、数年後もきっと動作する手順としてまとめられたかなと思いってます。とはいえ、MediaTailorはChannel AssemblyだけではなくAd insertionも機能アップデートをしっかり追っていかなければと思ったしだいでした。